MFA 強制ポリシーを適用した IAM ユーザーで初回ログイン時のパスワード変更(リセット)ができない時の対処法
コンバンハ、千葉(幸)です。
今回想定しているのは以下のようなケースです。
- IAM グループに MFA 強制ポリシーをアタッチしている
- 新規の IAM ユーザーを IAM グループに所属させる形で作成する
- IAM ユーザーには初回サインイン時のパスワードリセットを求める設定とする
- 当該ユーザーがパスワードリセットを試みた際にエラーが発生する
回避策をご紹介します。
先にまとめ
- 初回ログイン時のパスワード変更は
iam:ChangePassword
というアクションを呼び出している - 公式ドキュメントのポリシーを参考にする際は必要に応じてカスタマイズが必要
- 最低限
iam:ChangePassword
を禁止対象から除外することで対応する iam:ChangePassword
を明示的に Allow する必要があるかどうかはアカウントのポリシーに依存する
MFA 強制ポリシーとは
公式にそういった名称のポリシーがあるわけではありません。ここでは特定の条件を持つポリシーを、便宜上そう呼んでいます。
社内のセキュリティ標準によって「MFAを設定していない状態では特定のアクション以外は禁止」という設定を求められるケースは多々あるかと思います。
その際に参考にするポリシーとして、以下のあたりを参照することが多いのではないでしょうか。
- IAM: IAM ユーザーに MFA デバイスの自己管理を許可する - AWS Identity and Access Management
- AWS: MFA で認証された IAM ユーザーがセキュリティ認証情報ページで自分の認証情報を管理できるようにする - AWS Identity and Access Management
- AWS: MFA で認証された IAM ユーザーがセキュリティ認証情報ページで自分の MFA デバイスを管理できるようにする - AWS Identity and Access Management
( 1番目のポリシーを簡略化したものを以下エントリで取り上げていますのであわせてご参照ください。)
いずれのポリシーでも共通するのは、以下のようなステートメントを持つ点です。
---略--- { "Effect": "Deny", "NotAction": [ "iam:CreateVirtualMFADevice", "iam:EnableMFADevice", "iam:ListMFADevices", "iam:ListUsers", "iam:ListVirtualMFADevices", "iam:ResyncMFADevice" ], "Resource": "*", "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "false" } } ---略---
上記のハイライト部によって、以下の制御が行われます。
- 「MFAが設定されていなければ」(13-15行目)
- 「特定のアクション以外は」(4行目)
- 「禁止する」(3行目)
「特定のアクション」はポリシー例によって微妙に異なりますが、MFAの設定を行う上で必要になるものが羅列されています。
iam:ChangePassword
がここに含まれていないことが事象の原因となります。
ユーザー自身によるパスワードのリセット
IAM ユーザーを新規作成する際に[ パスワードのリセットが必要 ] を有効化するかどうかを選択できます。
ここを有効化したユーザーを作成し、使用者に引き渡したとします。
当該ユーザーが初回のサインインを試みた場合、パスワード認証後すぐに以下のページに遷移します。
ここではパスワードの変更が求められます。新しいパスワードを指定して先に進もうとすると、以下のエラーが発生します。
ユーザーに iam:ChangePassword を実行する権限がないか、入力されたパスワードが管理者によって設定されたアカウントパスワードポリシーに準拠していません
このパスワード変更を行うのはログイン直後のため、当然この時点では MFA は未設定です。 MFA 強制ポリシーでiam:ChangePassword
が Deny の NotAction に含まれていない場合に、上記の事象に直面するというわけです。
(ちなみに「ポリシー設定は適切だがアカウントのパスワードポリシーに則っていない」という場合にも同じエラーメッセージが出ます。メッセージからは切り分けできないのが少し辛いところです。)
iam:UpdateLoginProfile と iam:ChangePassword
余談ですが、 IAM ユーザーのパスワードを変更する際に呼び出されるアクションは2種類あります。
- iam:UpdateLoginProfile
- iam:ChangePassword
大まかには、前者は「IAM ユーザーの画面から対象ユーザーのパスワードを変更する」もの、後者は「専用画面から自分のパスワードを変更する」もの、と理解しておけばよいでしょう。
iam:UpdateLoginProfile
自分自身のパスワードを変更する場合でも、IAM ユーザーの画面から操作を行った場合には iam:UpdateLoginProfile が呼び出されます。
以下の画面が該当します。
(新規ユーザー作成時だけでなくパスワード変更時にも「パスワードのリセットが必要」を指定できます。変更対象のユーザーが「MFA強制ポリシーがあたっている」「MFAが未設定」の場合、冒頭の事象と同じ事態に直面します。)
iam:ChangePassword
初回ログイン時に変更を行う場合に必要となるのは先述の通りですが、「マイセキュリティ資格情報」から変更を行う際にも iam:ChangePassword が呼び出されています。
この辺りの詳細は、以下エントリに詳しいです。
エラーの回避方法
最低限行わなけらばならないのは、Deny の対象からiam:ChangePassword
を除外することです。
先述のポリシーを例に取ると、以下のように NotAction のリストにiam:ChangePassword
を加えることで実現できます。
---略--- { "Effect": "Deny", "NotAction": [ "iam:CreateVirtualMFADevice", "iam:EnableMFADevice", "iam:ListMFADevices", "iam:ListUsers", "iam:ListVirtualMFADevices", "iam:ResyncMFADevice", "iam:ChangePassword" ], "Resource": "*", "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "false" } } ---略---
IAM ユーザーにパスワードの変更を許可する
アカウントのパスワードポリシーによっては、追加で Allow のステートメントを定義する必要があります。
以下のパスワードポリシーで「ユーザーにパスワードの変更を許可する」が含まれていない場合、追加の設定が必要となります。
以下のようなポリシーを追加でアタッチするか、 MFA 強制ポリシーの中にステートメントを追加する必要があります。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:GetAccountPasswordPolicy", "Resource": "*" }, { "Effect": "Allow", "Action": "iam:ChangePassword", "Resource": "arn:aws:iam::<AWSアカウント番号>:user/${aws:username}" } ] }
アカウントのパスワードポリシーを AWS CLI から確認する場合は以下のイメージです。
% aws iam get-account-password-policy { "PasswordPolicy": { "MinimumPasswordLength": 8, "RequireSymbols": true, "RequireNumbers": true, "RequireUppercaseCharacters": true, "RequireLowercaseCharacters": true, "AllowUsersToChangePassword": true, "ExpirePasswords": false } }
AllowUsersToChangePassword
が true になっていれば、明示的にiam:ChangePassword
の Allow を追加しなくとも、ユーザーはパスワードの変更を行えます。
終わりに
MFA 強制ポリシーを適用した際のハマりどころについてのご紹介でした。
私が普段検証に使用している環境は以下の構成となり、IAM ユーザー側に Deny を入れていないため、今回の事象が起こりうることをすっかり忘れていました。
- IAM ユーザーには必要最小限の Allow を与える
- MFA 設定や、パスワード変更、IAM の参照のみなど
- 操作に必要な権限は IAM ロールに設定する
- IAM ユーザーでログイン後、 IAM ロールを引き受けて(Assume Role)から操作する
- IAM ロールの信頼ポリシーで「 MFA 設定がされていないと引き受け不可」という設定を入れておく
どちらの構成が望ましいかは環境によるため一概に言えませんが、MFA 強制ポリシーを採用するケースは多々あるかと思います。
今回のような考慮事項が発生する、ことを頭の片隅に置いておきましょう。
以上、千葉(幸)がお送りしました。